import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler


# 读取数据
def load_data(file_path):
    try:
        df = pd.read_excel(file_path)
        print(f"成功读取文件: {file_path}")
        print(f"数据形状: {df.shape}")
        return df
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return None


# 检查重复值
def check_duplicates(df):
    print("\n=== 重复值检查 ===")

    # 检查代码列重复值
    code_dups = df['代码'].duplicated().sum()
    print(f"代码列重复值数量: {code_dups}")

    # 检查名称列重复值
    name_dups = df['名称'].duplicated().sum()
    print(f"名称列重复值数量: {name_dups}")

    # 检查详细列重复值
    detail_dups = df['详细'].duplicated().sum()
    print(f"详细列重复值数量: {detail_dups}")


# 展示数据前5行并观察问题
def display_sample(df):
    print("\n=== 数据前5行 ===")
    print(df.head())

    print("\n=== 数据基本信息 ===")
    print(df.info())


# 处理上市日期，提取年月日
def process_listing_date(df):
    print("\n=== 处理上市日期 ===")

    # 检查上市日期列的数据类型
    print(f"上市日期原始类型: {df['上市日期'].dtype}")

    # 尝试转换为日期类型
    try:
        # 处理空值和非日期格式
        df['上市日期'] = pd.to_datetime(df['上市日期'], errors='coerce')

        # 提取年月日
        df['上市年份'] = df['上市日期'].dt.year
        df['上市月份'] = df['上市日期'].dt.month
        df['上市日'] = df['上市日期'].dt.day

        print("成功提取年月日信息")
        print(f"含有有效日期的数据行: {(~df['上市日期'].isna()).sum()}")
        print(f"日期无效或缺失的数据行: {df['上市日期'].isna().sum()}")

    except Exception as e:
        print(f"处理日期时出错: {e}")


# 数据归一化处理
def normalize_numeric_data(df):
    print("\n=== 数值型数据归一化处理 ===")

    numeric_columns = ['累计股息(%)', '年均股息(%)', '分红次数', '融资总额(亿)']
    scaler = MinMaxScaler()

    for col in numeric_columns:
        if col in df.columns:
            try:
                # 处理非数值型数据和缺失值
                df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0)

                # 进行归一化
                normalized_values = scaler.fit_transform(df[[col]])
                df[f'{col}_归一化'] = normalized_values

                print(f"{col} 归一化完成")
                print(f"  最小值: {df[col].min()}")
                print(f"  最大值: {df[col].max()}")
                print(f"  归一化后范围: [{df[f'{col}_归一化'].min():.4f}, {df[f'{col}_归一化'].max():.4f}]")

            except Exception as e:
                print(f"处理 {col} 时出错: {e}")


# 保存预处理后的数据
def save_processed_data(df, output_file):
    try:
        df.to_excel(output_file, index=False, engine='openpyxl')
        print(f"\n预处理完成！")
        print(f"数据已保存至: {output_file}")
        print(f"处理后的数据形状: {df.shape}")
    except Exception as e:
        print(f"保存文件时出错: {e}")


# 主函数
def main():
    # 输入和输出文件路径
    input_file = "新浪财经历史分红数据.xlsx"
    output_file = "新浪财经历史分红数据_预处理.xlsx"

    # 步骤1: 读取数据
    df = load_data(input_file)
    if df is None:
        return

    # 步骤2: 检查重复值
    check_duplicates(df)

    # 步骤3: 展示样本数据
    display_sample(df)

    # 步骤4: 处理上市日期
    process_listing_date(df)

    # 步骤5: 归一化数值型数据
    normalize_numeric_data(df)

    # 步骤6: 保存预处理后的数据
    save_processed_data(df, output_file)


if __name__ == "__main__":
    main()